#include <iostream>
#include <vector>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

#define MAXSIZE 8

template<class T>
class RingQueue
{
public:
    //构造函数
    RingQueue(int cap = MAXSIZE)
        :_capcity(cap),
        _b_pos(0),
        _d_pos(0)
    {
        _q.resize(_capcity);
        sem_init(&_block_sem, 0, _capcity);
        sem_init(&_data_sem, 0, 0);
    }
    //析构
    ~RingQueue()
    {
        sem_destroy(&_block_sem);
        sem_destroy(&_data_sem);
    }
    //P & V 操作
    void P(sem_t& s)
    {
        sem_wait(&s);
    }
    void V(sem_t& s)
    {
        sem_post(&s);
    }
    //插入（生产者生产）
    void Push(const T& data)
    {
        P(_block_sem); //申请信号量，容量信号量--
        _q[_b_pos] = data; //存放数据
        V(_data_sem); //数据信号量++

        _b_pos++;
        _b_pos %= _capcity;
    }
    //删除（消费者消费）
    void Pop(T& data)
    {
        P(_data_sem);
        data = _q[_d_pos];
        V(_block_sem);

        _d_pos++;
        _d_pos %= _capcity;
    }
private:
    std::vector<T> _q;
    int _capcity; //最大容量
    int _b_pos; //生产者位置
    int _d_pos; //消费者位置
    sem_t _block_sem; //容器容量的信号量
    sem_t _data_sem; //容器数据的信号量
};